#pragma once

#include <unistd.h>
#include <signal.h>
#include <cstdlib>
#include <cassert>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define DEV "/dev/null"

void daemonSelf(const char* currPath=nullptr)
{
    //1.让调用进程忽略掉异常信号
    signal(SIGPIPE,SIG_IGN);

    //2.如何让自己不是组长 setsid
    if(fork()>0)
    {
        exit(0);//父进程退出
    }
    //子进程--作为守护进程，也是精灵进程，本质就是孤儿进程的一种
    pid_t n=setsid();//将当前进程，也就是子进程，设置为新会话的组id
    assert(n!=-1);

    //3.守护进程是脱离终端的，关闭或者重定向以前进程默认打开文件
    int fd=open(DEV,O_RDWR);//以读写方式打开
    if(fd>=0)
    {
        dup2(fd,0);//重定向
        dup2(fd,1);
        dup2(fd,2);

        close(fd);
    }else{
        close(0);
        close(1);
        close(2);
    }
    //4.可选：进程执行路径发生改变

    if(currPath) chdir(currPath);
}

